package org.idea.dao.impl;

import org.idea.dao.ProductDao;
import org.idea.entity.Product;
import org.idea.util.DbUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * DAO接口的实现 - 根据实际需要，实现 DAO 接口
 *
 * 操作：实现 XxxDao接口，并重写 XxxDao 接口中的抽象方法，从而实现具体操作
 *
 * 命名规范：XxxDaoImpl
 *
 * @Author zqx
 * @Date 2023-10-10
 */
public class ProductDaoImpl implements ProductDao {
    @Override
    public int insertProduct(Product product) {
        int row = 0 ;
        // System.out.println("接口实现一:微信支付...");

        // 第一：定义要操作数据库的 SQL 语句
        String sql = "insert into product values (?,?,?,?,?,?,?)" ;

        // 第二：获取连接对象
        Connection conn = DbUtil.getConnection();
        PreparedStatement preparedStatement = null ;
        // 第三：预编译 SQL 语句，并获取语句对象的实例
        try {
            preparedStatement = conn.prepareStatement(sql);

            // 第四：填充占位符
            // 语句对象.setXxx(索引,数据)
            // 其中，Xxx代表是数据类型，索引代表是问号的索引，从 1 开始
            preparedStatement.setString(1,product.getProductName()) ;
            preparedStatement.setString(2,product.getProductType()) ;
            preparedStatement.setString(3,product.getProductDesc()) ;
            preparedStatement.setDouble(4,product.getProductPrice()); ;
            preparedStatement.setInt(5,product.getProductNumber()) ;
            preparedStatement.setString(6,product.getProductPicture()) ;
            preparedStatement.setInt(7,product.getProductStatus()) ;

            // 第五：执行SQL语句
            // executeUpdate()：执行增、删、改操作，返回受影响的行数
            // executeQuery()：执行查询操作，返回结果集对象
            row = preparedStatement.executeUpdate();

            // 第六：对执行的结果进行处理
        } catch (SQLException e) {
            // 对捕获的异步进行处理，保证程序能正常往下执行
            System.out.println("预编译 SQL 语句失败...");
        } finally {
            // 第七：关闭对象，释放资源
            DbUtil.close(conn,preparedStatement,null);
        }

        return row;
    }

    @Override
    public int deleteProduct(int productId) {
        return 0;
    }

    @Override
    public int updateProduct(Product product) {
        return 0;
    }

    @Override
    public List<Product> selectProduct() {
        List<Product> list = new ArrayList<>() ;

        // 第一：定义操作数据库的 SQL
        String sql = "select * from product" ;
        // 第二：获取连接对象
        Connection conn = DbUtil.getConnection() ;

        PreparedStatement psmt = null;
        ResultSet rst = null ;
        try {
            // 第三：预编译 SQL 语句，获取 PreparedStatement 对象
            psmt = conn.prepareStatement(sql);

            // 第四：填充占位符（可选）
            // 第五：执行 SQL 语句
            rst = psmt.executeQuery();
            // 第六：对执行的结果进行处理
            while(rst.next()) {
                // 1.实例化实体对象
                Product p = new Product();

                // 2.读到当前行各列的数据
                int id = rst.getInt(1);
                String name = rst.getString(2);
                String type = rst.getString(3);
                String desc = rst.getString(4);
                double price = rst.getDouble(5);
                int number = rst.getInt(6);
                String picture = rst.getString(7);
                int state = rst.getInt(8);

                // 3.初始化对象
                p.setId(id);
                p.setProductName(name);
                p.setProductType(type);
                p.setProductDesc(desc);
                p.setProductPrice(price);
                p.setProductNumber(number);
                p.setProductPicture(picture);
                p.setProductStatus(state);

                // 4.添加集合
                list.add(p) ;
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 第七：关闭相关的 JDBC 对象
            DbUtil.close(conn,psmt,rst);
        }
        return list ;
    }
}
